#!/bin/bash

normdate="./L9-normdate"

exceed_days_in_moth()
{
	case $(echo $1 | tr '[:upper:]' '[:lower:]') in
		jan*) days=31 ;; feb*) days=28 ;;
		mar*) days=31 ;; apr*) days=30 ;;
		may*) days=31 ;; jun*) days=30 ;;
		jul*) days=31 ;; aug*) days=31 ;;
		sep*) days=30 ;; oct*) days=31 ;;
		nov*) days=30 ;; dec*) days=31 ;;
		*) echo "$0: Неизвестное название месяца $1" >&2
		exit 1
	esac

	if [ $2 -lt 1 -o $2 -gt $days ]; then
		return 1
	else
		return 0 # Число месяца допустимо
	fi
}

is_leap_year()
{
	year=$1

	if [ "$((year % 4))" -ne 0 ]; then
		return 1
	elif [ "$((year % 400))" -eq 0 ]; then
		return 0
	elif [ "$((year % 100))" -eq 0 ]; then
		return 1
	else
		return 0
	fi
}

# Основной сценарий

if [ $# -ne 3 ]; then
	echo "Использование: $0 месяц день год" >&2
	echo "Допустимые форматы October 12 1973 или 10 12 1973"
	exit 1
fi

newdate="$($normdate "$@")"
if [ $? -eq 1 ]; then
	exit 1
fi

month="$(echo $newdate | cut -d\  -f1)"
day="$(echo $newdate | cut -d\  -f2)"
year="$(echo $newdate | cut -d\  -f3)"

if ! exceed_days_in_moth $month "$2"; then
	if [ "$month" = "Feb" -a "$2" -eq "29" ]; then
		if ! is_leap_year $3; then
			echo "$0: $3 не високосный год, поэтому в Феврале не может быть 29 дней" >&2
			exit 1
		fi
	else
		echo "$0: неверное значение дня даты, в $month нет $2 дней" >&2
		exit 1
	fi
fi

echo "Дата корректна: $newdate"

exit 0

